﻿/*
 * Created by SharpDevelop.
 * User: Lousabit
 * Date: 24/11/2011
 * Time: 12:54
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Globalization;
using System.Windows.Forms;
using Business_Entity;

namespace DAOFactory
{
	/// <summary>
	/// Description of DAOReporteVenta.
	/// </summary>
	public class DAOReporteVenta
	{
		public DAOReporteVenta()
		{
		}
		
		public static List<BELineaReporteVenta> getReporte(DateTime desde, DateTime hasta, BETienda tienda){
		
			ProdLinea pl;
    		ServLinea sl;
    		
    		List<BELineaReporteVenta> lista = new List<BELineaReporteVenta>();
    		
    		
    		DAOHelper dao = new DAOHelper(
    			@"VENTAS_REPORTE_POR_MES_J 
				@ini date,
				@fin date,
				@idTienda int");
    		
    		SqlDataReader reader = dao.ExecuteReader(
					    			desde,
					    			hasta,
					    			tienda.Id);
    		
    		while(reader.Read()){
    		
	    		BELineaReporteVenta linea = new BELineaReporteVenta();
	    		
	    		DateTime fechax = new DateTime((int)reader["anio"], (int)reader["mes"], 1);
	    		
	    		linea.Mes = fechax;
	    		
	    		//MessageBox.Show("A LA LINEA SE LE ASIGNO LA FECHAx "+linea.Mes.ToString());
	    		
	    		linea.Monto = (double)reader["monto"];
	    		    		
	    		lista.Add(linea);
	    		
    		}
    		
    		reader.Close();

			//sacar la lista de productos
			foreach(BELineaReporteVenta l in lista){
				dao = new DAOHelper(
					@"VENTAS_PRODUCTOS_VENDIDOS_POR_MES_J 
					@mes datetime,
					@idTienda int");

				reader = dao.ExecuteReader(l.Mes, tienda.Id);
				
				while(reader.Read()){
					pl = new ProdLinea();
					pl.producto = reader["nombreProducto"].ToString();
					pl.monto = (double)reader["total"];
		    		l.Prods.Add(pl);
				}
				
				reader.Close();
			}
			
			//sacar la lista de servicios
			foreach(BELineaReporteVenta l in lista){
				dao = new DAOHelper(
					@"VENTAS_SERVICIOS_VENDIDOS_POR_MES_J 
					@mes datetime,
					@idTienda int");

				reader = dao.ExecuteReader(l.Mes, tienda.Id);
				
				while(reader.Read()){
					sl = new ServLinea();
					sl.servicio = reader["servicioDescripcion"].ToString();
					sl.monto = (double)reader["total"];
		    		l.Servs.Add(sl);
				}
				
				reader.Close();
			}
    		
    		//llenar los meses vacios
    		
    		List<BELineaReporteVenta> listaTrue = new List<BELineaReporteVenta>();
    		
    		int mesCont = desde.Month;
    		int anoCont = desde.Year;
    		int cont = 0;
    		int contLista = 0;
    		
    		int nMeses = mesesEntre(desde, hasta);
    		    			
    		while(cont <= nMeses){
    			    			
    			//revisar
    			
				//vemos cuanto se salteo
				//MessageBox.Show("BUSCANDO ELEMENTO EN LA FECHA "+lista[contLista].Mes.ToString());
				//MessageBox.Show("ACTUALMENTE SE ENCONTRO "+mesCont+" "+anoCont);
				int mesesSalteados = -1;
				if (lista.Count-1 < contLista){
					mesesSalteados = -1;
				}else{
					mesesSalteados = mesesEntre(new DateTime(anoCont, mesCont, 1), lista[contLista].Mes);
				}
				
				//esa cantidad de meses salteados lo rellenamos con vacios
				/*
				for(int nx = 0; nx < mesesSalteados; nx++){
					BELineaReporteVenta ll = new BELineaReporteVenta();
					ll.Mes = new DateTime(;
					listaTrue.Add(
				}
    			*/
				//yaoming con el for, voy a recorrer uno por uno hasta que coincida xD
				if(mesesSalteados == 0){
					listaTrue.Add(lista[contLista]);
					contLista ++;
				}else{
					BELineaReporteVenta lvacia = new BELineaReporteVenta();
					lvacia.Mes = new DateTime(anoCont, mesCont, 1);
					lvacia.Monto = 0;
					listaTrue.Add(lvacia);
				}
    			
    			
    			
    			//aumentar contadores
    			mesCont = sigu(mesCont, anoCont).mes;
    			anoCont = sigu(mesCont, anoCont).ano;
    			cont ++;
    		}
    		
    		//MessageBox.Show("Se ha formado una lista con "+listaTrue.Count+" elemetos");
    		
    		
    		
    		return listaTrue;
		}
		
		private struct MesAno{
			public int mes;
			public int ano;
		}
		
		private static int mesesEntre(DateTime desde, DateTime hasta){
			int mes = desde.Month;
			int ano = desde.Year;
			int cont = 0;
			
			
			
			while(true){
			
				//MessageBox.Show("HASTA = "+hasta.Month+" "+hasta.Year+"\n"+"Estoy en "+mes+" "+ano);
				
				if (mes == hasta.Month && ano == hasta.Year) break;
				
				MesAno ma = sigu(mes, ano);
				
				mes = ma.mes;
				ano = ma.ano;
				
				cont ++;
				
			}
			
			return cont;
			
		}
		
		private static MesAno sigu(int mes, int ano){
			int sigMes = mes + 1;
			int sigAno = ano;
			
			if (sigMes == 13){
				sigMes = 1;
				sigAno ++;
			}
			
			MesAno sig = new MesAno();
			sig.mes = sigMes;
			sig.ano = sigAno;
			
			//MessageBox.Show(mes+" "+ano+" sigue -> "+sig.mes+" "+sig.ano);
			
			return sig;
		}
		
	}
}
